# from docx import Document
# from docx.shared import Pt
# from docx.oxml.ns import qn
# from docx.oxml import OxmlElement
#
# def add_toc_entry(doc, text, level):
#     paragraph = doc.add_paragraph()
#     run = paragraph.add_run(text)
#     run.font.size = Pt(10)
#     paragraph.paragraph_format.left_indent = Pt(level * 12)  # 缩进表示层级
#     paragraph.add_run("\nok")
#     print(paragraph.text)
#
# def parse_and_write_markdown_toc(md_path, output_docx):
#     doc = Document()
#     doc.add_heading('目录', level=1)
#     with open(md_path, 'r', encoding='utf-8') as f:
#         lines = f.readlines()
#     for line in lines:
#         if not line.strip().startswith("-"):
#             continue
#         level = (len(line) - len(line.lstrip(" "))) // 2
#         title = line.strip("- ").strip()
#         add_toc_entry(doc, title, level)
#     doc.save(output_docx)
# # 用法示例
# parse_and_write_markdown_toc("D:\\hbyt\\AI智能投标\\典型招标要求和投标文件\\目录.md", "目录输出.docx")

from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
from docx import Document
from docx.shared import Pt
import re
import os
from langchain_core.output_parsers import StrOutputParser
from langchain_deepseek import ChatDeepSeek
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from typing import List, Dict, Any, Tuple
os.environ["QIANFAN_AK"]="SGbbQdjFjlKurTfUIjYM0Q4P"
os.environ["QIANFAN_SK"]="lb1tKvDGRhqLZYH4ZYpke6Vco9n9X8Xv"
def is_leaf_title(idx, lines, current_level):
    """判断当前标题是否为最后一级"""
    for i in range(idx + 1, len(lines)):
        line = lines[i]
        next_level = (len(line) - len(line.lstrip(" "))) // 2
        if next_level > current_level:
            return False
        elif next_level <= current_level:
            break
    return True
def doc_llm_generation(con):
    import os
    from openai import OpenAI
    os.environ["DASHSCOPE_API_KEY"] = "sk-5c6689dccd074a739c78ef7d1d780148"
    client = OpenAI(
        # 若没有配置环境变量，请用阿里云百炼API Key将下行替换为：api_key="sk-xxx",
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        # 如何获取API Key：https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
    completion = client.chat.completions.create(
        model="deepseek-v3",  # 此处以 deepseek-r1 为例，可按需更换模型名称。
        messages=[
            {"role": "system", "content": '''
            你是一个专业的问答助手，请基于以下上下文回答问题。
            上下文来自文档的不同章节,你需要将根据内容和问题，如果检索到的是一个字一段落的，需要做一个总结
            根据问题和检索到的内容进行相似度匹配，如果是和user的问题最相似的第一段，那么返回第一段：

            案列像下面的输出，如果问题是“客户表扬奖励办法”，
            那么你需要给我回答的是“如果技术人员在具体项目获得客户的书面表扬，
            慧博云通将在内部进行通报表扬，并给予对应技术人员以一定奖励，
            以表彰技术人员在项目实施过程中的出色表现和辛勤付出。”，
            其他的不要回答了，这是一个案列，其他的你也需要严格按照这个来，：

            请根据上下文提供准确、详细的回答。如果上下文不包含相关信息，
            请回答"根据提供的文档，我无法回答这个问题"。'''},
            {"role": "user", "content": con},
        ],
    )


    # 通过content字段打印最终答案
    # print("最终答案：")
    # print(completion.choices[0].message.content)
    return completion.choices[0].message.content


def create_rag_chain(vector_store: Chroma) -> Any:
    """创建RAG问答链"""
    # 初始化LLM
    llm = ChatDeepSeek(
        model="deepseek-chat",
        api_key="sk-bfdc307c3def4f9da9a06775a127e7a1"
    )

    # 定义检索器 - 使用MMR算法确保多样性
    retriever = vector_store.as_retriever(
        search_type="mmr",
        search_kwargs={"k": 6, "lambda_mult": 0.5}
    )

    # 构建提示模板
    template = """
    你是一个专业的问答助手，请基于以下上下文回答问题。
    上下文来自文档的不同章节,你需要将根据内容和问题，
    根据问题和检索到的内容进行相似度匹配，如果是和query最相似的第一段，那么返回第一段：

    案列像下面的输出，如果问题是“客户表扬奖励办法”，那么你需要给我回答的是“如果技术人员在具体项目获得客户的书面表扬，慧博云通将在内部进行通报表扬，并给予对应技术人员以一定奖励，以表彰技术人员在项目实施过程中的出色表现和辛勤付出。
”，其他的不要回答了，这是一个案列，其他的你也需要严格按照这个来，：

    相关上下文：
    {context}

    问题：{question}

    请根据上下文提供准确、详细的回答。如果上下文不包含相关信息，请回答"根据提供的文档，我无法回答这个问题"。
    """
    prompt = ChatPromptTemplate.from_template(template)

    # 构建处理链
    return (
            {"context": retriever, "question": RunnablePassthrough()}
            | prompt
            | llm
            | StrOutputParser()
    )

def search_doc_content(query):
    embedding = QianfanEmbeddingsEndpoint()
    db = Chroma(persist_directory="D:\\hbyt\\project\\aibid\\db\\d4", embedding_function=embedding)
    results = db.similarity_search(query, k=1)
    print(results)
    doc_llm_generation(results[0].page_content)
    # 构建RAG链
    # rag_chain = create_rag_chain(db)
    # print("\nRAG系统准备就绪，请输入问题（输入'exit'退出）")
    # return doc_llm_generation(results[0].page_content)
    return results[0].page_content
    # return rag_chain.invoke(query)
def write_outline_to_docx(md_path, output_path):
    print("ok")
    doc = Document()
    # doc.add_heading("目录结构文档", level=1)
    with open(md_path, 'r', encoding='utf-8') as f:
        lines = [line for line in f if line.strip().startswith("-")]
    for idx, line in enumerate(lines):
        level = (len(line) - len(line.lstrip(" "))) // 2
        title = line.strip("- ").strip()
        # 写标题（Word 标题1~6）
        doc.add_heading(title, level=min(level + 1, 6))
        # 如果是最后一级，写正文内容
        if is_leaf_title(idx, lines, level):
            para = doc.add_paragraph(search_doc_content(re.sub(r'^\d+(\.\d+)*\s*', '', title)))
            para.style.font.size = Pt(10)
    doc.save(output_path)
# 用法示例
write_outline_to_docx("D:\\hbyt\\AI智能投标\\典型招标要求和投标文件\\目录.md", "目录结构输出.docx")
